﻿using CSharpPro.properties._1028;

namespace CSharpPro.Properties._1028;

// UserService.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

public class UserService : IUserService
{
    // d. 创建泛型集合保存注册用户信息
    private readonly List<User> _users = new List<User>();

    public void Start()
    {
        while (true)
        {
            Console.WriteLine("\n--- 主菜单 ---");
            Console.WriteLine("1. 登录");
            Console.WriteLine("2. 注册");
            Console.WriteLine("3. 删除用户"); // 新增菜单项
            Console.WriteLine("4. 退出");     // 选项序号调整
            Console.Write("请选择操作 (1-4): ");
            string choice = Console.ReadLine();
            int option;
            if (!int.TryParse(choice, out option) || option < 1 || option > 3)
            {
                Console.WriteLine("请输入有效数字 (1-4)。");
                continue;
            }

           
            switch
                (option)
            {
                case 1:
                    HandleLogin();
                    break;
                case 2:
                    HandleRegister();
                    break;
                case 3: // 新增处理
                    HandleDeleteUser();
                    break;
                case 4:
                    Console.WriteLine("感谢使用，再见！");
                    return;
            }
        }
    }
    private void HandleLogin()
    {
        Console.WriteLine("\n--- 用户登录 ---");
        Console.Write("请输入用户名: ");
        string username = Console.ReadLine()?.Trim();
        Console.Write("请输入密码: ");
        string password = Console.ReadLine()?.Trim();

        if (Login(username, password))
        {
            Console.WriteLine("\n登录成功！欢迎回来, " + username);
            // 模拟进入系统首页
            Console.WriteLine(">>> 正在进入系统首页... (按任意键返回主菜单)");
            Console.ReadKey();
        }
    }

    private void HandleRegister()
    {
        Console.WriteLine("\n--- 用户注册 ---");
        Console.Write("请输入用户名 (3-15位, 字母/数字/下划线): ");
        string username = Console.ReadLine()?.Trim();
        Console.Write("请输入密码 (6-20位, 必须包含大小写字母和数字): ");
        string password = Console.ReadLine()?.Trim();
        Console.Write("请再次输入密码: ");
        string confirmPassword = Console.ReadLine()?.Trim();

        if (Register(username, password, confirmPassword))
        {
            Console.WriteLine("注册成功！您现在可以登录了。");
        }
    }
    
    private void HandleDeleteUser()
    {
        Console.WriteLine("\n--- 删除用户 ---");
        Console.Write("请输入要删除的用户名: ");
        string username = Console.ReadLine()?.Trim();

        if
            (DeleteUser(username))
        {
            Console.WriteLine($"用户 '{username}' 已成功删除。");
        }
    }

    public bool Register(string username, string password, string confirmPassword)
    {
        // 2.3 输入容错
        if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password))
        {
            Console.WriteLine("错误：用户名或密码不可为空。");
            return false;
        }

        // 2.1 用户名规则验证
        if (username.Length < 3 || username.Length > 15 || !Regex.IsMatch(username, @"^[a-zA-Z0-9_]+$"))
        {
            Console.WriteLine("错误：用户名必须为3-15个字符，且只能包含字母、数字和下划线。");
            return false;
        }

        // 检查用户名是否已存在
        // e. 使用foreach循环进行数据迭代
        foreach (var user in _users)
        {
            if (user.Username.Equals(username, StringComparison.OrdinalIgnoreCase))
            {
                Console.WriteLine("错误：该用户名已被注册。");
                return false;
            }
        }

        // 2.2 密码规则验证
        if (password.Length < 6 || password.Length > 20)
        {
            Console.WriteLine("错误：密码长度必须为6-20个字符。");
            return false;
        }
        if (!Regex.IsMatch(password, @"[A-Z]") || !Regex.IsMatch(password, @"[a-z]") || !Regex.IsMatch(password, @"[0-9]"))
        {
            Console.WriteLine("错误：密码必须包含至少1个大写字母、1个小写字母和1个数字。");
            return false;
        }
        if (password != confirmPassword)
        {
            Console.WriteLine("错误：两次输入的密码不一致。");
            return false;
        }

        // 注册成功，将用户添加到集合
        _users.Add(new User(username, password));
        return true;
    }

    public bool Login(string username, string password)
    {
        // 2.3 输入容错
        if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password))
        {
            Console.WriteLine("错误：用户名或密码不可为空。");
            return false;
        }

        // 验证用户
        // e. 使用foreach循环进行数据迭代
        foreach (var user in _users)
        {
            // 使用 StringComparison.OrdinalIgnoreCase 实现不区分大小写的用户名匹配
            if (user.Username.Equals(username, StringComparison.OrdinalIgnoreCase))
            {
                if (user.Password == password)
                {
                    return true; // 验证通过
                }
                else
                {
                    Console.WriteLine("错误：密码错误。");
                    return false;
                }
            }
        }

        Console.WriteLine("错误：用户名不存在。");
        return false;
    }
    public bool DeleteUser(string username)
    {
        if (string.IsNullOrWhiteSpace(username))
        {
            Console.WriteLine("错误：用户名不可为空。");
            return false;
        }

        // 使用 for 循环从后向前遍历并删除元素
        for (int i = _users.Count - 1; i >= 0; i--)
        {
            // 使用不区分大小写的比较
            if (_users[i].Username.Equals(username, StringComparison.OrdinalIgnoreCase))
            {
                _users.RemoveAt(i); // 安全删除
                return true; // 找到并删除后，立即返回
            }
        }

        // 如果循环结束都没有找到用户
        Console.WriteLine($"错误：用户 '{username}' 不存在。");
        return false;
    }
}